#ifndef _XX_YY_BMOCK_OUT_ARG
#define _XX_YY_BMOCK_OUT_ARG
#include "bmock_arg_val.hpp"

namespace bmock {
	struct out_arg_val : public arg_val {
		static const char *UNKNOWN;
	protected:
		bool				update(const arg_checker &chk,const std::string &v) const;
		out_arg_val(const char *const n);
		void                print(std::ostream &os) const;
		std::string         get_out_value(const arg_checker &) const;
		virtual std::string get_out_value() const;
		virtual bool        update_out_value(const arg_checker &chk,const std::string &v) const =0;
		bool				null_expected(const std::string &v) const;
		~out_arg_val();
	};

	template<typename T> arg_val *const make_out_arg_val(const char *const n,T *vp);
	template<typename T> arg_val* const make_out_arg_val(const char *const n,T &vr);
	arg_val *const make_out_arg_val(const char *const n,char *const vp);
	arg_val *const make_out_arg_val(const char *const n,unsigned char *const vp);
};

#include <boost/preprocessor/stringize.hpp>

#define __BMOCK_USE_OUT(ARG)\
	bmock::make_out_arg_val(BOOST_PP_STRINGIZE(ARG),ARG)

#endif
